package com.gexiao.config;

import com.gexiao.bean.Color;
import com.gexiao.bean.Person;
import com.gexiao.beans.factory.ColorFactoryBean;
import com.gexiao.context.annotation.LinuxCondition;
import com.gexiao.context.annotation.MyImportBeanDefinitionRegistrar;
import com.gexiao.context.annotation.MyImportSelector;
import com.gexiao.context.annotation.WinCondition;
import org.springframework.beans.factory.config.ConfigurableBeanFactory;
import org.springframework.context.annotation.*;

//配置类==配置文件
//@Conditional({WinCondition.class})
@Configuration
//给组件快速导入一个类，默认id为类的全限名
@Import({Color.class, MyImportSelector.class, MyImportBeanDefinitionRegistrar.class})
public class MainConfig2 {
    /**
     * @see ConfigurableBeanFactory#SCOPE_PROTOTYPE 多实例模式：默认IOC加载完不会调用，只有使用的时候才去IOC容器创建一个新的实例
     * @see ConfigurableBeanFactory#SCOPE_SINGLETON 单实例模式：默认IOC容器创建的时候就会加载，使用的时候从IOC容器获取
     * @see org.springframework.web.context.WebApplicationContext#SCOPE_REQUEST 一次request请求中是单例的（不常用）
     * @see org.springframework.web.context.WebApplicationContext#SCOPE_SESSION 一次seesion请求中是单例的（不常用）
     * @see #value
     */
    @Bean
    @Scope(value = ConfigurableBeanFactory.SCOPE_SINGLETON)
//    @Lazy
    public Person person() {
        System.out.println("bean实例创建。。。");
        return new Person("王五", 31);
    }

    @Conditional({WinCondition.class})
    @Bean("bill")
    public Person person01(){
        return new Person("bill", 65);
    }

    @Conditional({LinuxCondition.class})
    @Bean("linux")
    public Person person02(){
        return new Person("linux", 55);
    }

    /**
     * 默认返回{@link ColorFactoryBean#getObjectType()}所定义的类型，
     * 如果要获取工厂本身，需要在{@link org.springframework.context.ApplicationContext#getBean(String)}参数加上'&'
     * @return color instance
     */
    @Bean
    public ColorFactoryBean colorFactoryBean(){
        return new ColorFactoryBean();
    }
}
